#ifndef planificador_H
#define planificador_H
#include <stdbool.h>
#include <stdio.h>
typedef struct abb abb_t;
//funciones para asignar al abb
typedef int (*abb_comparar_clave_t) (const char *, const char *);
typedef void (*abb_destruir_dato_t) (void *);

//Pre:Se le pasa por parametro 2 funciones: la primera es la que compara
//las claves del arbol y la segunda la que destruye los datos, segun lo que almacene
//Post: si todo sale bien se devuelve un puntero a arbol vacio, si se produce 
//algun error se devuelve NULL
abb_t* abb_crear(abb_comparar_clave_t cmp, abb_destruir_dato_t destruir_dato);

//Pre: Se creo el arbol, se le pasa por parametro el arbol creado, la clave
// y el dato.
//Post: devuelve el true y actualiza el arbol si todo salio bien, devuleve fase
//si se produce algun error.
bool abb_guardar(abb_t *arbol, const char *clave, void *dato);

//Pre:Se le pasa un arbol y una clave a borrar
//Post: Si la clave y el arbol existen devuelve el dato asociado a la 
//misma, sino devuelve NULL
void *abb_borrar(abb_t *arbol, const char *clave);

//Pre: se le pasa una arbol ya creado y una clave por parametro
//Post: si no se le manda un parametro o la clave no existe devuelve NULL
//si todo sale bien devuelve el dato correspondiente a esa clave
void *abb_obtener(const abb_t *arbol, const char *clave);

//Pre: se le pasa el arbol y la clave por parametro (ya creadas)
//Post: devuelve true si la clave pertenece al arbol, devuelve false si
//la clave no pertenece o no se le envio algun parametro.
bool abb_pertenece(const abb_t *arbol, const char *clave);

//Pre: se le pasa un arbol por parametro
//Post: devuelve la cantidad de nodos del arbol
size_t abb_cantidad(abb_t* arbol);

//Pre: se le pasa un arbol por parametro
//Post: destruye todo el arbol, incluyendo subarboles, destruye tanto  
//los nodos como los datos
void abb_destruir(abb_t *arbol);

//Pre: se le pasa un arbol(cada nodo tiene clave y dato),una funcion booleana
// y un extra a la funcion
//Post: la funcion itero el arbol de modo in order y aplico la funcion
//pasada por parametro a cada nodo. No devuelve valor.
void abb_in_order(abb_t *arbol, bool funcion(const char *, void *, void *), void *extra);


typedef struct abb_iter abb_iter_t;

//Pre: se le pasa un arbol por parametro
//Post: devuelve un iter parado en la primer posicion del arbol
//(con clave mas baja) si hay un error con memoria devuelve NULL
abb_iter_t *abb_iter_in_crear(const abb_t *arbol);
//Pre:se le pasa el iter por parametro
//Post: devuelve true si pudo avanzar de modo inorder, false se produjo
//algun error
bool abb_iter_in_avanzar(abb_iter_t *iter);

//Pre: se le pasa el iter al final
//Post: devuevle la clave si esta parado en un nodo,
//devuelve NULL si esta al finl o se produjo algun error
const char *abb_iter_in_ver_actual(const abb_iter_t *iter);

//Pre: se le pasa el iter por parametro
//Post:devuelve true si esta al final, devuelve false si no esta al final
//o se produjo algun error
bool abb_iter_in_al_final(const abb_iter_t *iter);

//Pre: se le pasa el iter por paremtro
//Post: libero el espacio asignado al iter en memoria
void abb_iter_in_destruir(abb_iter_t* iter);


#endif // ABB_H
